home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / searchz.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  5KB  |  230 lines

  1. /* 自機をサーチするザコ */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12.  
  13. #define PALET_MAIN    0x0800
  14. #define PALET_MAIN1    0x0600
  15.  
  16. #define wabs(x) ((x) >= 0 ? (short) (x) : (short) -(x))
  17. #define abs(x)  ((x) >= 0 ? (int) (x) : (int) -(x))
  18.  
  19.  
  20. static short points_disp;    /* 得点を表示するか */
  21. static short points_disp1;
  22.  
  23. static short EnemyMoveSearchZ (ENEMY *);
  24. static void EnemyTiniSearchZ (ENEMY *);
  25.  
  26.  
  27. /* ゲーム開始時に1回だけ呼ばれる */
  28. void EnemyInitStaticSearchZ (void)
  29. {
  30.     points_disp = 0;
  31.     points_disp1 = 0;
  32. }
  33.  
  34.  
  35. void EnemyInitSearchZ (ENEMY * p)
  36. {
  37.     signed short x = SHORT_LX;
  38.     /* このザコに関してはX座標は中心からの距離で */
  39.     /* 常にプレイヤーの反対側に現れる */
  40.     if (player->x < 144) {
  41.         p->lx = (player->x + x) * 65536;
  42.         p->vx = 16384;
  43.     } else {
  44.         p->lx = (player->x - x) * 65536;
  45.         p->vx = -16384;
  46.     }
  47.     p->vy = 4 * 65536;
  48.  
  49.     p->hit_px = 8;
  50.     p->hit_py = 12;
  51.     p->hit_sx = 12;
  52.     p->hit_sy = 12;
  53.     p->hit_cx = 4;
  54.     p->damage = p->damage_core = 0;
  55.     p->hp = 1;
  56.     p->seq = 0;
  57.     p->m_work = 0;
  58.     p->m_work4 = 0;        /* 1回接近したか */
  59.     p->angle = 64;
  60.     p->pt = obj_searchz + ((p->angle) >> 3);
  61.  
  62.     if (p->arg == 0)
  63.         p->info = PALET_MAIN | PRIORITY_ZAKO;
  64.     else
  65.         p->info = PALET_MAIN1 | PRIORITY_ZAKO;
  66.  
  67.     p->core_pt = sp_core01 + 1;
  68.     p->core_info = PALET_CORE_BLUE | PRIORITY_ZAKO;
  69.     p->func_enemy_move = EnemyMoveSearchZ;
  70.     p->func_enemy_tini = EnemyTiniSearchZ;
  71. }
  72.  
  73.  
  74.  
  75. static short EnemyMoveSearchZ (ENEMY * p)
  76. {
  77.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  78.     p->x = (p->lx += p->vx) >> 16;
  79.     p->y = (p->ly += p->vy) >> 16;
  80.  
  81.     switch (p->seq) {
  82.  
  83.         /* まず突っ込んでくる */
  84.     case 0:
  85.         if (p->m_work++ > 16)
  86.             p->seq++;
  87.         break;
  88.  
  89.         /* 減速 */
  90.     case 1:
  91.         p->vy -= 32768;
  92.         if (p->vy <= 32768) {
  93.             p->seq++;
  94.             p->m_work2 = p->m_work2 = 0;
  95.             p->core_info = PALET_CORE_RED | PRIORITY_ZAKO;    /* コア赤くなる */
  96. #define SPEED_SHOT1    15
  97.             if (p->arg) {
  98.                 EshotInit (ESHOT_NRG02, p->x, p->y, SPEED_SHOT1, psearch (p->x, p->y), 0);
  99.                 SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  100.             }
  101.         }
  102.         break;
  103.  
  104.         /* 直線運動しつつこちらを向く */
  105.     case 2:
  106.         if (p->m_work++ > 4) {
  107.             p->m_work = 0;
  108.             if (p->m_work2++ < 6) {
  109.                 /* 自機の方を向く */
  110.                 if ((unsigned char) (p->angle - psearch (p->x, p->y)) > (unsigned char) 128)
  111.                     p->angle += 4;
  112.                 else
  113.                     p->angle -= 4;
  114.                 p->pt = obj_searchz + ((p->angle) >> 3);
  115.             } else {
  116.                 if (wabs (player->x - SHORT_LX) > 32)
  117.                     p->seq = 3;    /* 自機から遠ければ近付く */
  118.                 else
  119.                     p->seq = 4;    /* 自機に近ければそのまま逃げる */
  120.                 p->m_work = p->m_work2 = 0;
  121.             }
  122.         }
  123.         break;
  124.  
  125.         /* 自機に近付く */
  126.     case 3:
  127.         if (p->m_work++ > 4) {
  128.             p->m_work = 0;
  129.             /* 自機の方を向く */
  130.             if ((unsigned char) (p->angle - psearch (p->x, p->y)) > (unsigned char) 128)
  131.                 p->angle += 2;
  132.             else
  133.                 p->angle -= 2;
  134.             p->pt = obj_searchz + ((p->angle) >> 3);
  135.         }
  136.         p->m_work2++;
  137.         if ((p->m_work2 < 5) && ((abs (p->vx) < 1.5 * 65536) && (abs (p->vy) < 1.5 * 65536))) {
  138.             p->vx += vxtable[0][p->angle];
  139.             p->vy += vytable[0][p->angle];
  140.         }
  141.         if ((p->m_work2 > 40) && (p->m_work4 < 1)) {
  142.             p->seq = 4;
  143.             p->m_work = p->m_work2 = 0;
  144.             p->m_work4++;
  145.         }
  146.         break;
  147.  
  148.         /* 自機から遠ざかる */
  149.     case 4:
  150.         if (p->m_work++ > 4) {
  151.             p->m_work = 0;
  152.             /* 自機の方を向く */
  153.             if ((unsigned char) (p->angle - psearch (p->x, p->y)) > (unsigned char) 128)
  154.                 p->angle += 2;
  155.             else
  156.                 p->angle -= 2;
  157.             p->pt = obj_searchz + ((p->angle) >> 3);
  158.         }
  159.         p->m_work2++;
  160.         if ((p->m_work2 < 3) && ((abs (p->vx) < 1.5 * 65536) && (abs (p->vy) < 1.5 * 65536))) {
  161.             p->vx -= vxtable[0][p->angle];
  162.             p->vy -= vytable[0][p->angle];
  163.         }
  164.         if ((p->m_work2 > 40) && (p->m_work4 < 2)) {
  165.             p->seq = 3;
  166.             p->m_work = p->m_work2 = 0;
  167.             p->m_work4++;
  168.         }
  169.         break;
  170.  
  171.     default:
  172.         break;
  173.     }
  174.     /* 画面外に出たら消去 */
  175.     if ((p->seq > 0)
  176.         && ((SHORT_LY < -32) || (SHORT_LY > 256 + 32)
  177.         || (SHORT_LX < -32) || (SHORT_LX > 256 + 32)))
  178.         return (-1);    /* 消去 */
  179.  
  180.  
  181.     /* 自機ショットに当たった時の処理 */
  182.     /* ザコは一撃で死ぬのでコア云々は考慮しなくて良い */
  183.     if (p->damage) {
  184.         EffectInit (EFFECT_EXPLZAKO, 0, p->x, p->y);
  185.         SoundSetSE (SE_EXPL);
  186.         if (p->arg == 0) {
  187.             if (points_disp < ZAKO_SCORE_DISP) {
  188.                 points_disp++;
  189.                 if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  190.                     EffectInit (EFFECT_POINTS_RED, POINTS_200, p->x, p->y);
  191.                 else
  192.                     EffectInit (EFFECT_POINTS_BLUE, POINTS_100, p->x, p->y);
  193.             } else {
  194.                 if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  195.                     EffectInit (EFFECT_POINTS, POINTS_200, p->x, p->y);
  196.                 else
  197.                     EffectInit (EFFECT_POINTS, POINTS_100, p->x, p->y);
  198.             }
  199.         } else {
  200.             if (points_disp1 < ZAKO_SCORE_DISP) {
  201.                 points_disp1++;
  202.                 if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  203.                     EffectInit (EFFECT_POINTS_RED, POINTS_200, p->x, p->y);
  204.                 else
  205.                     EffectInit (EFFECT_POINTS_BLUE, POINTS_100, p->x, p->y);
  206.             } else {
  207.                 if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  208.                     EffectInit (EFFECT_POINTS, POINTS_200, p->x, p->y);
  209.                 else
  210.                     EffectInit (EFFECT_POINTS, POINTS_100, p->x, p->y);
  211.             }
  212.         }
  213.         return (-1);    /* 消去 */
  214.     }
  215.     xobj_set_st (p);
  216.  
  217.     /* コアの表示 */
  218.     p->core_x = p->x - 8;
  219.     p->core_y = p->y - 8;
  220.     xsp_set_st (&(p->core_x));
  221.  
  222.     return (0);
  223. }
  224.  
  225.  
  226.  
  227. static void EnemyTiniSearchZ (ENEMY * p)
  228. {
  229. }
  230.